//
//  main.c
//  Static and Extern
//
//  Created by admin on 2019/7/28.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
    Static 修饰局部变量
 
    如果局部变量被Static修饰，这个变量叫做静态变量
    1）不再存储在栈区，而是存储在常量区，不会被回收。
    2）第一次执行的时候，将这个变量声明在常量区，执行完毕后不会被回收；第二次执行的时候，声明静态变量的代码就不会再执行
    例：StaticModifierLocalVariable();
 
    当我们分模块开发的时候，如果要在模块中声明全局变量
    1）全局变量的声明要写在.h文件中
    2）全局变量的定义要写在.c文件中
    3）并且这个全局变量必须要用static或者extern修饰，否则会报错
 
    如果使用extern修饰全局变量，可以跨模块调用。也可用来修饰函数，但是函数默认情况下就是extern，可跨模块调用。
    如果使用static修饰全局变量/函数，只能在模块内使用。例：globalNo2
 
 */

#include <stdio.h>
#include "Global variable.h"

//局部变量没有被static修饰
void TheVariableIsNotStatic(void);

//static修饰局部变量 变成静态变量
void StaticModifierLocalVariable(void);

//反复调用的情况
void ItIsNotStaticResult(void);

int main(int argc, const char * argv[])
{
    ItIsNotStaticResult();
    printf("No1 = %d,No2 = %d\n",globalNo1,globalNo2);
    return 0;
}



//反复调用的情况
void ItIsNotStaticResult(void)
{
    TheVariableIsNotStatic(); //num = 1
    TheVariableIsNotStatic(); //num = 1
    TheVariableIsNotStatic(); //num = 1
    TheVariableIsNotStatic(); //num = 1
    TheVariableIsNotStatic(); //num = 1
    
    printf("\n");
    
    StaticModifierLocalVariable(); //num = 1
    StaticModifierLocalVariable(); //num = 2
    StaticModifierLocalVariable(); //num = 3
    StaticModifierLocalVariable(); //num = 4
    StaticModifierLocalVariable(); //num = 5
    
    printf("\n");
    
}

//static修饰局部变量 变成静态变量
void StaticModifierLocalVariable(void)
{
    static int num = 0;
    num += 1;
    printf("num = %d  ",num);
    
}

//局部变量没有被static修饰的情况
void TheVariableIsNotStatic(void)
{
    
    int num = 0;
    num += 1;
    printf("num = %d  ",num);
    
    
}
